package com.igeek.boot.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @Author fengqq
 * @Description TODO
 * @Date 2024/9/9  16:29
 *
 * 1.默认单线程同步执行
 * 2.一个任务执行完上一次之后，才会执行下一次调度 spring task的调度任务是串行的，
 *   意思就是如果配了多个任务的话，前面一个任务没有结束，后面的任务即使是时间到点了也不会跑。
 * 3.多任务之间按顺序执行，一个任务执行完成之后才会执行另一个任务
 *
 * 解决方法：
 * 1.调整线程池的大小 spring.task.scheduling.pool.size=3
 * 2.开启异步执行@EnableAsync+@Async  底层实现原理是 CompletableFuture
 */
@Component
//开启定时任务
@EnableScheduling
//开启异步执行
@EnableAsync
@Slf4j
public class MyTask {

    @Scheduled(cron = "0/5 * * * * ? ")
    //让当前方法在异步线程中执行
    @Async
    public void printBy5() throws InterruptedException {
        log.info("MyTask printBy5定时任务正在执行....{}",Thread.currentThread().getName());
        //沉睡30s
        TimeUnit.SECONDS.sleep(30);
    }

    @Scheduled(cron = "0/10 * * * * ? ")
    //让当前方法在异步线程中执行
    @Async
    public void printBy10() throws InterruptedException {
        log.info("MyTask printBy10定时任务正在执行....{}",Thread.currentThread().getName());
    }
}
